package com.ant.collect.excel;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelDataProcessor {
//    public static void main(String[] args) {
//        try {
//            String f1 = "f:/hb/123.xlsx";
//            // 2. 写入新Excel（替换为你的输出文件路径）
//            String f2 = "f:/hb/66.xlsx";
//
//            // 读取原始Excel文件
//            FileInputStream inputFile = new FileInputStream(f1);
//            Workbook workbook = WorkbookFactory.create(inputFile);
//            Sheet sheet = workbook.getSheetAt(0);
//
//            // 创建新的Excel文件
//            Workbook newWorkbook = new XSSFWorkbook();
//            Sheet newSheet = newWorkbook.createSheet("行业分类数据");
//
//            // 处理数据
//            List<IndustryData> industryDataList = processExcelData(sheet);
//
//            // 写入新Excel文件
//            writeToNewExcel(newSheet, industryDataList);
//
//            // 保存文件
//            FileOutputStream outputFile = new FileOutputStream(f2);
//            newWorkbook.write(outputFile);
//
//            // 关闭资源
//            workbook.close();
//            newWorkbook.close();
//            inputFile.close();
//            outputFile.close();
//
//            System.out.println("数据转换完成，已保存到 processed_industry_data.xlsx");
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

    public static void main(String[] args) {
        String f1 = "f:/hb/123.xlsx";
        // 2. 写入新Excel（替换为你的输出文件路径）
        String f2 = "f:/hb/77.xlsx";
        try {
            // 读取输入的Excel文件
            Workbook inputWorkbook = getWorkbook(f1);
            Sheet inputSheet = inputWorkbook.getSheetAt(0);

            // 处理数据
            List<IndustryCategory> nodes = processExcelSheet(inputSheet);

            // 创建新的Excel工作簿和工作表
            Workbook outputWorkbook = new XSSFWorkbook();
            Sheet outputSheet = outputWorkbook.createSheet("Processed Data");

            // 写入表头
            Row headerRow = outputSheet.createRow(0);
            String[] headers = {"code", "name", "parent_id", "level"};
            for (int i = 0; i < headers.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(headers[i]);
            }

            // 写入处理后的数据
            int rowNum = 1;
            for (IndustryCategory node : nodes) {
                writeNodeToSheet(node, outputSheet, rowNum++);
            }

            // 保存新的Excel文件
            try (FileOutputStream outputStream = new FileOutputStream(f2)) {
                outputWorkbook.write(outputStream);
            }

            System.out.println("数据处理并保存成功！");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static Workbook getWorkbook(String filePath) throws IOException {
        FileInputStream fileInputStream = new FileInputStream(new File(filePath));
        if (filePath.endsWith(".xlsx")) {
            return new XSSFWorkbook(fileInputStream);
        } else {
            return new HSSFWorkbook(fileInputStream);
        }
    }

    private static List<IndustryCategory> processExcelSheet(Sheet sheet) {
        List<IndustryCategory> nodes = new ArrayList<>();
        List<IndustryCategory> parentStack = new ArrayList<>();

        for (Row row : sheet) {

            Cell codeCell=null;
            if(!row.getCell(0).equals("")){
                codeCell= row.getCell(0);
            }
            if(!row.getCell(1).equals("")){
                codeCell= row.getCell(1);
            }
            if(!row.getCell(2).equals("")){
                codeCell= row.getCell(2);
            }
            if(!row.getCell(3).equals("")){
                codeCell= row.getCell(3);
            }

            Cell nameCell = row.getCell(4);
            if (codeCell == null || nameCell == null) {
                continue;
            }
            String code = getCellValue(codeCell);
            String name = getCellValue(nameCell);

            // 通过计算名称前面的空格数来确定层级，这里假设是通过空格缩进体现层级
            int level = (name.length() - name.trim().length()) / 2 + 1;
            IndustryCategory node = new IndustryCategory(code, name.trim(), level);
            while (parentStack.size() >= level) {
                parentStack.remove(parentStack.size() - 1);
            }
            if (!parentStack.isEmpty()) {
                String code1 = parentStack.get(parentStack.size() - 1).getCode();
                node.setParentId(Integer.parseInt(code1));
            } else {
                node.setParentId(0);
            }
            nodes.add(node);
            parentStack.add(node);
        }

        return nodes;
    }

    private static String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    return String.valueOf((int) cell.getNumericCellValue());
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            default:
                return "";
        }
    }

    private static void writeNodeToSheet(IndustryCategory node, Sheet sheet, int rowNum) {
        Row row = sheet.createRow(rowNum);
        Cell codeCell = row.createCell(0);
        Cell nameCell = row.createCell(1);
        Cell parentIdCell = row.createCell(2);
        Cell levelCell = row.createCell(3);

        codeCell.setCellValue(node.getCode());
        nameCell.setCellValue(node.getName());
        parentIdCell.setCellValue(node.getParentId());
        levelCell.setCellValue(node.getLevel()==null?0:node.getLevel());
    }
//
//    // 处理Excel数据的核心方法
//    private static List<IndustryData> processExcelData(Sheet sheet) {
//        List<IndustryData> result = new ArrayList<>();
//        Map<String, String> codeToParentMap = new HashMap<>();
//
//        for (Row row : sheet) {
//           // if (row.getRowNum() == 0) continue; // 跳过表头
//
//            String code = getCellValue(row.getCell(0));
//            String name = getCellValue(row.getCell(4)); // 名称在第5列（索引4）
//
//            if (code.isEmpty() || name.isEmpty()) continue;
//
//            // 计算层级和父级ID
//            int level = calculateLevel(code);
//            String parentId = calculateParentId(code, level, codeToParentMap);
//
//            result.add(new IndustryData(code, name, parentId, String.valueOf(level)));
//            // 存储当前code的父级映射，供后续子节点使用
//            codeToParentMap.put(code, parentId);
//        }
//
//        return result;
//    }
//
//    // 计算层级深度
//    private static int calculateLevel(String code) {
//        if (code.matches("[A-Z]$")) return 1;      // 门类（如A、B）
//        if (code.matches("^\\d{1}$")) return 2;   // 大类（如1、2）
//        if (code.matches("^\\d{2}$")) return 3;   // 中类（如11、12）
//        return 4;                                 // 小类（如111、112）
//    }
//
//    // 计算父级ID
//    private static String calculateParentId(String code, int level, Map<String, String> codeToParentMap) {
//        if (level == 1) return "0"; // 门类的父级为0
//
//        // 根据层级获取父级code的格式
//        String parentCodePattern = "";
//        switch (level) {
//            case 2:
//                parentCodePattern = "[A-Z]";
//                break;    // 大类的父级是门类（字母）
//            case 3:
//                parentCodePattern = "^\\d{1}$";
//                break; // 中类的父级是大类（1位数字）
//            case 4:
//                parentCodePattern = "^\\d{2}$";
//                break; // 小类的父级是中类（2位数字）
//            default:
//                return "0";
//        }
//
//        // 从已存储的code中查找匹配父级格式的最近节点
//        String parentId = "0";
//        for (String existingCode : codeToParentMap.keySet()) {
//            if (existingCode.matches(parentCodePattern) && code.startsWith(existingCode)) {
//                parentId = existingCode;
//                break;
//            }
//        }
//        return parentId;
//    }
//
//    // 获取单元格值
//    private static String getCellValue(Cell cell) {
//        if (cell == null) return "";
//
//        switch (cell.getCellType()) {
//            case STRING:
//                return cell.getStringCellValue().trim();
//            case NUMERIC:
//                if (DateUtil.isCellDateFormatted(cell)) {
//                    return cell.getDateCellValue().toString();
//                } else {
//                    return String.valueOf((int) cell.getNumericCellValue());
//                }
//            default:
//                return "";
//        }
//    }
//
//    // 写入新Excel文件
//    private static void writeToNewExcel(Sheet sheet, List<IndustryData> dataList) {
//        int rowNum = 0;
//        // 写入表头
//        Row headerRow = sheet.createRow(rowNum++);
//        headerRow.createCell(0).setCellValue("code");
//        headerRow.createCell(1).setCellValue("name");
//        headerRow.createCell(2).setCellValue("parent_id");
//        headerRow.createCell(3).setCellValue("level");
//
//        // 写入数据行
//        for (IndustryData data : dataList) {
//            Row row = sheet.createRow(rowNum++);
//            row.createCell(0).setCellValue(data.code);
//            row.createCell(1).setCellValue(data.name);
//            row.createCell(2).setCellValue(data.parentId);
//            row.createCell(3).setCellValue(data.level);
//        }
//    }
//
//    // 数据模型类
//    static class IndustryData {
//        String code;
//        String name;
//        String parentId;
//        String level;
//
//        public IndustryData(String code, String name, String parentId, String level) {
//            this.code = code;
//            this.name = name;
//            this.parentId = parentId;
//            this.level = level;
//        }
//    }
}
